package modelo;

import java.awt.Point;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;

public class Nivel {
	
	protected int puntosDelNivel;
	protected Mapa mapa;//
	protected Bombita protagonista;//
	protected EstadosDelJuego estadoDelNivel; //
	protected ControladorJuego controlador;
	protected Ventana ventana;


	
	public Nivel() throws IOException{
		this.controlador = new ControladorJuego();
		this.mapa = new Mapa(18,18);
		this.generarVistaCasilleros();
		this.marcarSalidaMapa();
		this.controlador.cargarMapa(mapa);
		this.ventana = new Ventana(600,600,controlador);
		controlador.setSuperficieDeDibujo(ventana);
		this.estadoDelNivel = EstadosDelJuego.Jugando;
		this.crearBombita(1,3);

	}
	
	
	public void marcarSalidaMapa() throws IOException{
		Random rnd = new Random();
		rnd.setSeed(new Date().getTime());
		Point posicion = new Point(rnd.nextInt(this.mapa.getFilas()), rnd.nextInt(this.mapa.getColumnas()));
		Casillero cas = mapa.obtenerCasillero(posicion);
		Imagen vistaSalida = new Imagen(this.getClass().getResource("/SALIDA.png"),cas,30);
		controlador.agregarDibujable(vistaSalida);
		mapa.marcarSalida(posicion);
		
	}
	
	
	public Bombita getJugador(){
		return this.protagonista;
	}
	
	
	public void cargarNIvelUno() throws IOException{
		this.crearChala();
		this.crearTimer();
		this.crearToletole();
		this.crearBloqueAcero(5);
		this.crearBloqueLadrillos(6);
		this.crearBloqueCemento(7);	
		this.crearCecilio(0, new CreadorEstrategiaNivelUno());
		this.crearLR(0, new CreadorEstrategiaNivelUno());
		this.crearLRA(0, new CreadorEstrategiaNivelUno());	
		controlador.ubicarContenidos();
		System.out.print("Nivel Uno cargado\n");
	}
	
	
	
	public void cargarNivelDos() throws IOException{
		this.crearChala();
		this.crearTimer();
		this.crearToletole();
		this.crearBloqueAcero(10);
		this.crearBloqueLadrillos(10);
		this.crearBloqueCemento(10);
		this.crearCecilio(0, new CreadorEstrategiaNivelDos());
		this.crearLR(0, new CreadorEstrategiaNivelDos());
		this.crearLRA(0, new CreadorEstrategiaNivelDos());	
		controlador.ubicarContenidos();
		System.out.print("Nivel Dos cargado\n");
	}
	

	public void generarVistaCasilleros() throws IOException{
		Iterator<Casillero> it = mapa.getCasilleros().iterator();
		while(it.hasNext()){
			Casillero casillero = it.next();
			Imagen vistaCasillero = new Imagen(this.getClass().getResource("/pasto.png"),casillero,30);
			controlador.agregarDibujable(vistaCasillero);
		}
	}
	
	
	public void crearCecilio(int velocidad, CreadorEstrategia cEstrategia) throws IOException{
		Cecilio enemigo = new Cecilio();
		enemigo.setVelocidad(velocidad);
		EstrategiaEnemiga estrategia = cEstrategia.crearEstrategia(mapa, protagonista, enemigo);
		enemigo.setEstrategia(estrategia);
		controlador.agregarEnemigo(enemigo);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/CECILIO.png"),enemigo,30));
		controlador.agregarObjetoVivo(enemigo);	
	}
	
	
	public void crearLR(int velocidad, CreadorEstrategia cEstrategia) throws IOException{
		LopezReggae enemigo = new LopezReggae();
		enemigo.setVelocidad(velocidad);
		EstrategiaEnemiga estrategia = cEstrategia.crearEstrategia(mapa, protagonista, enemigo);
		enemigo.setEstrategia(estrategia);
		controlador.agregarEnemigo(enemigo);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/LOPEZR.png"),enemigo,30));
		controlador.agregarObjetoVivo(enemigo);	
	}
	
	
	
	public void crearLRA(int velocidad, CreadorEstrategia cEstrategia) throws IOException{
		LopezReggaeAlado enemigo = new LopezReggaeAlado();
		enemigo.setVelocidad(velocidad);
		EstrategiaEnemiga estrategia = cEstrategia.crearEstrategia(mapa, protagonista, enemigo);
		enemigo.setEstrategia(estrategia);
		controlador.agregarEnemigo(enemigo);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/LOPEZRA.png"),enemigo,30));
		controlador.agregarObjetoVivo(enemigo);	
	}
	
	
	
	public void crearBombita(int velocidad, int vidas) throws IOException{
		Bombita bombita = new Bombita();
		bombita.setVelocidad(velocidad);
		bombita.setVidas(vidas);
		this.protagonista = bombita;
		controlador.setJugador(bombita);
		controlador.agregarObjetoVivo(bombita);
		controlador.agregarKeyObservador(new ControladorBombita(bombita,mapa,controlador.getObjetosVivos()));
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/BOMBITA.png"),bombita,30));
	}
	
	
	
	public void crearChala() throws IOException{
		Chala chala = new Chala();
		controlador.agregarObjetoVivo(chala);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/ARTEFACTO.png"),chala,30));
		System.out.print("Chala nueva creada\n");
		
	}
	
	
	
	public void crearTimer() throws IOException{
		Timer timer = new Timer();
		controlador.agregarObjetoVivo(timer);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/ARTEFACTO.png"),timer,30));
		System.out.print("Timer nuevo creado\n");
		
	}
	
	
	
	public void crearToletole() throws IOException{
		Toletole toletole = new Toletole();
		controlador.agregarObjetoVivo(toletole);
		controlador.agregarDibujable(new Imagen(this.getClass().getResource("/ARTEFACTO.png"),toletole,30));
		System.out.print("ToleTole nuevo creado\n");
	}
	
	
	public void crearBloqueLadrillos(int porcentajeMapa) throws IOException{
		int cantidad = (porcentajeMapa*this.mapa.getColumnas()*this.mapa.getFilas())/100;
		for (int i = 0; i < cantidad; i++){
			BloqueLadrillos bloque = new BloqueLadrillos();
			controlador.agregarObjetoVivo(bloque);
			controlador.agregarDibujable(new Imagen(this.getClass().getResource("/LADRILLOS.png"),bloque,30));
			System.out.print("Nuevo Bloque creado\n");
		}
	}
	
	
	
	public void crearBloqueCemento(int porcentajeMapa) throws IOException{
		int cantidad = (porcentajeMapa*this.mapa.getColumnas()*this.mapa.getFilas())/100;
		for (int i = 0; i < cantidad; i++){
			BloqueCemento bloque = new BloqueCemento();
			controlador.agregarObjetoVivo(bloque);
			controlador.agregarDibujable(new Imagen(this.getClass().getResource("/CEMENTO.png"),bloque,30));
			System.out.print("Nuevo Bloque creado\n");
		}
	}
	
	
	
	public void crearBloqueAcero(int porcentajeMapa) throws IOException{
		int cantidad = (porcentajeMapa*this.mapa.getColumnas()*this.mapa.getFilas())/100;
		for (int i = 0; i < cantidad; i++){
			BloqueAcero bloque = new BloqueAcero();
			controlador.agregarObjetoVivo(bloque);
			controlador.agregarDibujable(new Imagen(this.getClass().getResource("/ACERO.png"),bloque,30));
			System.out.print("Nuevo Bloque creado\n");
		}
	}
	
	
	public EstadosDelJuego actualizarEstado(){
		return controlador.actualizarEstado();
	}
	
	
	
	public boolean nivelEnJuego(){
		return controlador.nivelEnJuego();
	}
	
	
	public void jugar(){
		ventana.setVisible(true);
		controlador.comenzar();
	}

}
